#include "stdafx.h"
#include "_GraphData.h"

_GraphData::_GraphData(TCHAR* Title)
{
    m_MinX = DBL_MAX;
    m_MinY = DBL_MAX;
    m_MaxX = -DBL_MAX;
    m_MaxY = -DBL_MAX;
    m_SelectionMin = -DBL_MAX;
    m_SelectionMax = DBL_MAX;
    m_SelectionMaxIndex = -1;
    m_SelectionMinIndex = -1;
    m_Visible = true;
    m_LineColor = 0;
    m_PointColor = 0;
    m_Title = Title;
    m_DrawLine = true;
    m_PointSize = 2.5;
}

_GraphData::_GraphData()
{
    m_MinX = DBL_MAX;
    m_MinY = DBL_MAX;
    m_MaxX = -DBL_MAX;
    m_MaxY = -DBL_MAX;
    m_Visible = true;
    m_DrawLine = true;
    m_LineColor = 0;
    m_PointColor = 0;
    m_PointSize = 2.5;
    m_Title = _T("NoTitle");
    m_SelectionMin = DBL_MIN;
    m_SelectionMax = DBL_MAX;
    m_SelectionMaxIndex = -1;
    m_SelectionMinIndex = -1;
}

_GraphData::~_GraphData(void)
{
}

////////////////////////////////////////////////////////////////////////
// @ Beschreibung:  Adds a new Point to data and updates Min/Max data
//
// @ Parameter:     X - X value
//                  Y - Y value
//
// @ Return:        VOID
////////////////////////////////////////////////////////////////////////
void _GraphData::addPoint(double X, double Y)
{
    if(X > m_MaxX)
    {
        m_MaxX = X;
    }

    if(X < m_MinX)
    {
        m_MinX = X;
    }

    if(Y < m_MinY)
    {
        m_MinY = Y;
    }

    if(Y > m_MaxY)
    {
        m_MaxY = Y;
    }

    _s32 i = 0;

    if(m_Points.size() > 0)
    {
        i = m_Points.size();
    }

    while(i > 0 && i < (_s32)m_Points.size() && (_s32)m_Points[i].m_X > X)
    {
        i--;
    }

    m_Points.insert(m_Points.begin() + i, _2DPoint(X, Y));

    if(i > m_SelectionMaxIndex && X <= m_SelectionMax)
    {
        m_SelectionMaxIndex = i;
    }

    if(i < m_SelectionMinIndex && X >= m_SelectionMin)
    {
        m_SelectionMinIndex = i;
    }
}

////////////////////////////////////////////////////////////////////////
// @ Beschreibung:  Set the current selection
//
// @ Parameter:     Min, Max - Selection range
//
// @ Return:        VOID
////////////////////////////////////////////////////////////////////////
void _GraphData::setSelection(double Min, double Max)
{
    m_SelectionMin = Min;
    m_SelectionMax = Max;
    m_SelectionMinIndex = -1;
    m_SelectionMaxIndex = m_Points.size() - 1;

    for(_u32 i = 0; i < m_Points.size(); i++)
    {
        if(m_Points[i].m_X > m_SelectionMax)
        {
            m_SelectionMaxIndex = i - 1;
            break;
        }

        if(m_SelectionMinIndex == -1 && m_Points[i].m_X > m_SelectionMin)
        {
            m_SelectionMinIndex = i;
            continue;
        }
    }
}

////////////////////////////////////////////////////////////////////////
// @ Beschreibung:  Deselect all
//
// @ Parameter:     VOID
//
// @ Return:        VOID
////////////////////////////////////////////////////////////////////////
void _GraphData::resetSelection()
{
    m_SelectionMinIndex = -1;
    m_SelectionMaxIndex = -1;
}

bool _GraphData::isSelectionActive()
{
    if(m_SelectionMinIndex == -1 || m_SelectionMaxIndex == -1)
    {
        return false;
    }
    else
    {
        return true;
    }
}